#coding:utf8
from django.conf import settings
from urllib.parse import urlencode,parse_qs
from urllib.request import urlopen
import json

"""
抽取代码的步骤:
1. 分析出 某一部分代码能够实现特定的功能 (如果一个功能出现了2次, 很长 的代码实现了一个功能)
2. 将代码原封不动的复制到一个方法中,哪里有问题改哪里,对应的数据如果没有,则以参数的形式传递
3. 将复制的代码 注释调,用抽取的代码进行验证

"""

class QQOauthTool(object):

    # def __init__(self, client_id=None, redirect_uri=None):
    #     self.client_id = client_id or settings.QQ_APP_ID
    #     self.redirect_uri = redirect_uri or settings.QQ_REDIRECT_URL

    def get_oauth_url(self):
        # state = 'test'
        state = '/'
        # base_url 要添加问号
        base_url = 'https://graph.qq.com/oauth2.0/authorize?'

        # 组织一个字典,这个字典来存放参数
        parmas = {
            'response_type': 'code',
            'client_id': settings.QQ_APP_ID,
            'redirect_uri': settings.QQ_REDIRECT_URL,
            'state': state
        }

        # 需要将字典的参数拼接到 base_url中
        # urllib.parse.urlencode(query)
        # 将query字典转换为url路径中的查询字符串

        auth_url = base_url + urlencode(parmas)

        return auth_url


    def get_token_by_code(self,code):
        # 注意添加 ?
        base_url = 'https://graph.qq.com/oauth2.0/token?'

        params = {
            'grant_type': 'authorization_code',
            'client_id': settings.QQ_APP_ID,
            'client_secret': settings.QQ_APP_KEY,
            'code': code,
            'redirect_uri': settings.QQ_REDIRECT_URL
        }

        url = base_url + urlencode(params)

        # 我们自己去请求来获取数据
        # 通过urlopen来请求url中数据
        response = urlopen(url)

        data = response.read().decode()
        # parse_qs将获取的参数转换为字典
        dict = parse_qs(data)

        access_tokens = dict.get('access_token')

        if access_tokens:
            access_token = access_tokens[0]


            return access_token



    def get_openid_by_token(self,token):

        """
        PC网站：https://graph.qq.com/oauth2.0/me

        参数	是否必须	含义
        access_token	必须	在Step1中获取到的access token。

        """

        base_url = 'https://graph.qq.com/oauth2.0/me?'

        params = {
            'access_token':token
        }

        url = base_url + urlencode(params)


        # 自己区获取数据
        response = urlopen(url)
        #获取数据
        data = response.read().decode()

        # print(data)
        #'callback( {"client_id":"101474184","openid":"32A792C9563858A10ACED089784D9B9E"} );'
        # 我们对返回的数据进行截取
        try:
            dict = json.loads(data[10:-4])
        except Exception:
            raise Exception('数据获取失败')

        # print(dict)

        openid = dict.get('openid')

        if openid:
            return openid

        return None

